package server

import (
	"fmt"
	"net"

	"gb28181/internal/config"
	"gb28181/internal/manager"
	"gb28181/internal/protocol"

	"github.com/zeromicro/go-zero/core/logx"
)

// GB28181UDPServer UDP服务器实现
type GB28181UDPServer struct {
	config    *config.Config
	clientMgr *manager.ClientManager
	conn      *net.UDPConn
	logger    logx.Logger
}

// NewGB28181UDPServer 创建UDP服务器
func NewGB28181UDPServer(cfg *config.Config, mgr *manager.ClientManager) *GB28181UDPServer {
	return &GB28181UDPServer{
		config:    cfg,
		clientMgr: mgr,
		logger:    logx.WithCallerSkip(1),
	}
}

// Start 启动UDP服务器
func (s *GB28181UDPServer) Start(port int) error {
	addr := fmt.Sprintf(":%d", port)
	udpAddr, err := net.ResolveUDPAddr("udp", addr)
	if err != nil {
		return fmt.Errorf("解析UDP地址失败: %v", err)
	}

	conn, err := net.ListenUDP("udp", udpAddr)
	if err != nil {
		return fmt.Errorf("启动UDP服务器失败: %v", err)
	}
	s.conn = conn

	s.logger.Infof("GB28181 UDP服务器启动成功，监听端口: %d", port)

	// 启动消息处理循环
	go s.handleMessages()

	return nil
}

// handleMessages 处理UDP消息
func (s *GB28181UDPServer) handleMessages() {
	buffer := make([]byte, 1024)

	for {
		n, clientAddr, err := s.conn.ReadFromUDP(buffer)
		if err != nil {
			s.logger.Errorf("读取UDP消息失败: %v", err)
			continue
		}

		message := string(buffer[:n])
		s.logger.Debugf("收到UDP消息 from %s: %s", clientAddr.String(), message)

		// 处理消息
		response := s.handleGB28181Message(message)

		// 发送响应
		_, err = s.conn.WriteToUDP([]byte(response), clientAddr)
		if err != nil {
			s.logger.Errorf("发送UDP响应失败: %v", err)
		}
	}
}

// handleGB28181Message 处理GB28181协议消息（支持SIP格式）
func (s *GB28181UDPServer) handleGB28181Message(message string) string {
	// 创建消息处理器
	handler := protocol.NewMessageHandler(s.clientMgr)

	// 解析消息
	msg, err := protocol.ParseMessage([]byte(message))
	if err != nil {
		s.logger.Errorf("消息解析失败: %v", err)
		return fmt.Sprintf("ERROR:消息解析失败 - %v", err)
	}

	// 处理消息
	response, err := handler.HandleMessage(msg)
	if err != nil {
		s.logger.Errorf("消息处理失败: %v", err)
		return fmt.Sprintf("ERROR:消息处理失败 - %v", err)
	}

	// 检查是否是SIP消息，如果是则构建SIP格式响应
	useSIPFormat := protocol.IsSIPMessage([]byte(message))
	var sipFrom, sipTo, sipCallID string

	if useSIPFormat {
		// 解析原始消息获取SIP头部信息
		sipMsg, parseErr := protocol.ParseSIPMessage([]byte(message))
		if parseErr == nil {
			sipFrom = sipMsg.From
			sipTo = sipMsg.To
			sipCallID = sipMsg.CallID
		}
	}

	// 构建响应
	responseData, err := protocol.BuildResponse(
		response.CmdType,
		response.SN,
		response.DeviceID,
		response.Result,
		response.Status,
		response.Info,
		useSIPFormat,
		sipFrom,
		sipTo,
		sipCallID,
	)
	if err != nil {
		s.logger.Errorf("响应构建失败: %v", err)
		return fmt.Sprintf("ERROR:响应构建失败 - %v", err)
	}

	return string(responseData)
}

// Stop 停止服务器
func (s *GB28181UDPServer) Stop() {
	if s.conn != nil {
		s.conn.Close()
		s.logger.Info("GB28181 UDP服务器已停止")
	}
}
